from datetime import datetime

def get_valid_time_input(prompt: str) -> tuple:
    """
    获取用户输入的有效时间（时、分、秒），并进行合法性校验
    :param prompt: 输入提示文本
    :return: 合法的时间元组 (小时, 分钟, 秒)
    """
    while True:
        try:
            # 接收用户输入，支持空格/冒号分隔（如 17 10 5 或 18:15:30）
            time_str = input(prompt).strip().replace(' ', ':')
            hour, minute, second = map(int, time_str.split(':'))
            
            # 校验时间范围合法性
            if not (0 <= hour < 24):
                print("❌ 小时必须在 0-23 之间，请重新输入！")
            elif not (0 <= minute < 60):
                print("❌ 分钟必须在 0-59 之间，请重新输入！")
            elif not (0 <= second < 60):
                print("❌ 秒必须在 0-59 之间，请重新输入！")
            else:
                return hour, minute, second
        
        # 处理输入格式错误（如非数字、分隔符错误）
        except ValueError:
            print("❌ 输入格式错误！请按 '时 分 秒' 或 '时:分:秒' 格式输入（如 17 10 5 或 18:15:30）")


def calculate_time_interval() -> None:
    """
    主函数：获取时间输入、计算间隔并格式化输出结果
    """
    print("=" * 50)
    print("          高精度时间间隔计算器          ")
    print("说明：支持跨天计算，结果精确到秒（如 23:59:59 到 00:00:01）")
    print("=" * 50)

    # 1. 获取用户输入的起始时间和结束时间
    print("\n【请输入起始时间】")
    start_h, start_m, start_s = get_valid_time_input("请输入起始时间（时 分 秒 或 时:分:秒）：")
    
    print("\n【请输入结束时间】")
    end_h, end_m, end_s = get_valid_time_input("请输入结束时间（时 分 秒 或 时:分:秒）：")

    # 2. 构造 datetime 对象（使用固定日期 2024-01-01，仅关注时间部分）
    base_date = "2024-01-01"
    start_time = datetime.strptime(f"{base_date} {start_h}:{start_m}:{start_s}", "%Y-%m-%d %H:%M:%S")
    end_time = datetime.strptime(f"{base_date} {end_h}:{end_m}:{end_s}", "%Y-%m-%d %H:%M:%S")

    # 3. 处理跨天场景（若结束时间早于起始时间，自动加1天）
    if end_time < start_time:
        from datetime import timedelta
        end_time += timedelta(days=1)

    # 4. 计算时间间隔（timedelta 对象）
    time_diff = end_time - start_time

    # 5. 解析间隔为 天、时、分、秒
    days = time_diff.days
    total_seconds = time_diff.seconds  # 仅包含 0-86399 秒（不包含 days 部分）
    hours = total_seconds // 3600
    remaining_seconds = total_seconds % 3600
    minutes = remaining_seconds // 60
    seconds = remaining_seconds % 60

    # 6. 格式化输出结果（根据实际间隔简化显示，如无天数则不显示）
    print("\n" + "=" * 50)
    print("计算结果：")
    print(f"起始时间：{start_h:02d}:{start_m:02d}:{start_s:02d}")
    print(f"结束时间：{end_h:02d}:{end_m:02d}:{end_s:02d}")
    print("-" * 50)
    
    # 拼接结果字符串（适配有无天数的场景）
    if days > 0:
        result = f"{days} 天 {hours:02d} 小时 {minutes:02d} 分钟 {seconds:02d} 秒"
    else:
        result = f"{hours:02d} 小时 {minutes:02d} 分钟 {seconds:02d} 秒"
    
    print(f"✅ 时间间隔：{result}")
    print("=" * 50)


# 程序入口
if __name__ == "__main__":
    calculate_time_interval()